import { ElMessage, ElNotification } from 'element-plus'
import logger from './logger'

export interface ApiError extends Error {
  code?: string
  status?: number
  response?: any
}

/**
 * 统一错误处理工具
 */
class ErrorHandler {
  /**
   * 处理API错误
   * @param error 错误对象
   * @param operation 操作描述
   * @param showNotification 是否显示通知
   */
  static handleApiError(
    error: ApiError,
    operation: string = '操作',
    showNotification: boolean = true
  ): void {
    logger.error(`${operation}失败`, { error })

    let message = '操作失败'
    let type: 'error' | 'warning' | 'info' = 'error'

    // 根据错误类型设置消息
    if (error.status) {
      switch (error.status) {
        case 400:
          message = `${operation}参数错误`
          type = 'warning'
          break
        case 401:
          message = '认证失败，请重新登录'
          type = 'warning'
          break
        case 403:
          message = '权限不足'
          type = 'warning'
          break
        case 404:
          message = '请求的资源不存在'
          type = 'warning'
          break
        case 500:
          message = '服务器内部错误'
          type = 'error'
          break
        default:
          message = `${operation}失败 (${error.status})`
      }
    } else if (error.code) {
      switch (error.code) {
        case 'NETWORK_ERROR':
          message = '网络连接失败，请检查网络设置'
          type = 'error'
          break
        case 'TIMEOUT':
          message = '请求超时，请稍后重试'
          type = 'error'
          break
        default:
          message = error.message || `${operation}失败`
      }
    } else {
      message = error.message || `${operation}失败`
    }

    // 显示错误消息
    if (showNotification) {
      if (type === 'error') {
        ElMessage.error(message)
      } else if (type === 'warning') {
        ElMessage.warning(message)
      } else {
        ElMessage.info(message)
      }
    }

    // 对于认证错误，可以考虑重定向到登录页
    if (error.status === 401) {
      // 可以在这里添加登出逻辑
      // auth.logout()
    }
  }

  /**
   * 显示业务错误通知
   * @param message 错误消息
   * @param title 通知标题
   */
  static showBusinessError(message: string, title: string = '操作失败'): void {
    ElNotification({
      title,
      message,
      type: 'error',
      duration: 5000
    })
  }

  /**
   * 显示成功通知
   * @param message 成功消息
   * @param title 通知标题
   */
  static showSuccess(message: string, title: string = '操作成功'): void {
    ElNotification({
      title,
      message,
      type: 'success',
      duration: 3000
    })
  }

  /**
   * 显示警告通知
   * @param message 警告消息
   * @param title 通知标题
   */
  static showWarning(message: string, title: string = '注意'): void {
    ElNotification({
      title,
      message,
      type: 'warning',
      duration: 5000
    })
  }

  /**
   * 处理表单验证错误
   * @param errors 验证错误对象
   */
  static handleFormErrors(errors: Record<string, string>): void {
    Object.keys(errors).forEach(field => {
      ElMessage.error(errors[field])
    })
  }
}

export default ErrorHandler